﻿using System;
using System.Collections.Generic;
using NHibernate;
using NHibernate.Criterion;
using Neturion.Dados;
using Neturion.IRepositorios;

namespace Neturion.Repositorios
{
    public class RepositorioTipoFormaPagamento : IRepositorioTipoFormaPagamento
    {
        public TipoFormaPagamento Inserir(TipoFormaPagamento tipoFormaPagamento)
        {
            GerenciadorBDConfigs.Instance.SessaoAtual().Save(tipoFormaPagamento);
            return tipoFormaPagamento;
        }

        public TipoFormaPagamento Atualizar(TipoFormaPagamento tipoFormaPagamento)
        {
            TipoFormaPagamento tmpTipoFormaPagamento = ObterPorId(tipoFormaPagamento.TipoFormaPagamentoId);
            // Atribuicao dos valores do objeto da memoria para o objeto obtido no banco de dados
            tmpTipoFormaPagamento.Codigo = tipoFormaPagamento.Codigo;
            tmpTipoFormaPagamento.Descricao = tipoFormaPagamento.Descricao;
            tmpTipoFormaPagamento.EnumTipoFormaPagamento = tipoFormaPagamento.EnumTipoFormaPagamento;

            GerenciadorBDConfigs.Instance.SessaoAtual().Update(tmpTipoFormaPagamento);
            return tmpTipoFormaPagamento;
        }

        public void Excluir(TipoFormaPagamento tipoFormaPagamento)
        {
            GerenciadorBDConfigs.Instance.SessaoAtual().Delete(tipoFormaPagamento);
        }

        public IList<TipoFormaPagamento> ObterTodos()
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(TipoFormaPagamento));
            return criteria.List<TipoFormaPagamento>() as List<TipoFormaPagamento>;
        }

        public List<TipoFormaPagamento> ObterTodos(int inicio, int quantidade, int quantidadeMinima, 
            string codigo, 
            string descricao,
            EnumTipoFormaPagamento enumTipoFormaPagamento)
        {
            if (quantidade.Equals(0))
            {
                quantidade = quantidadeMinima;
            }

            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof (TipoFormaPagamento))
                .SetFirstResult(inicio).SetMaxResults(quantidade);

            if (!string.IsNullOrEmpty(codigo))
            {
                criteria.Add(Restrictions.Eq("Codigo", codigo));
            }

            if (!string.IsNullOrEmpty(descricao))
            {
                criteria.Add(Restrictions.Like("Descricao", descricao, MatchMode.Anywhere));
            }

            if (enumTipoFormaPagamento > 0)
            {
                criteria.Add(Restrictions.Eq("EnumTipoFormaPagamento", enumTipoFormaPagamento));
            }

            return criteria.List<TipoFormaPagamento>() as List<TipoFormaPagamento>;
        }

        public TipoFormaPagamento ObterPorId(int id)
        {
            return GerenciadorBDConfigs.Instance.SessaoAtual().Get<TipoFormaPagamento>(id);
        }

        public int ObterUltimoIdCodigoInteiro()
        {
            string[] literal = new string[] 
                {"a","b","c","d","e","f","g","h","i","j"
                ,"l","m","n","o","p","q","r","s","t","u","v","x","z","y"
                ,"w"};

            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(TipoFormaPagamento)).SetMaxResults(1);

            for (int i = 0; i <= literal.Length - 1; i++)
            {
                criteria.Add(Restrictions.Not(Restrictions.Like("Codigo", literal[i], MatchMode.Anywhere)));
            }

            criteria.AddOrder(Order.Desc("TipoFormaPagamentoId"));


            TipoFormaPagamento tipoFormaPagamento = criteria.UniqueResult<TipoFormaPagamento>();
            int ultimoCodigo = tipoFormaPagamento != null ? tipoFormaPagamento.TipoFormaPagamentoId : 0;

            return ultimoCodigo;
        }

        public TipoFormaPagamento ObterPorCodigo(string codigo)
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(TipoFormaPagamento))
                .Add(Restrictions.Eq("Codigo", codigo));

            return criteria.UniqueResult<TipoFormaPagamento>() as TipoFormaPagamento;
        }
    }
}